home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / fast278j.lzh / XREF.F < prev   
Text File  |  1980-01-01  |  3KB  |  183 lines

  1. ;XREF utility for ASM files.
  2.  
  3. const mf=16
  4. var lm,ln,count
  5.  
  6. print bios "XREF by Peter Campbell. v2" cr lf
  7.  
  8. on error
  9.     {
  10.     num=error
  11.     error msg "\dos.err"
  12.     print bios "!"
  13.     terminate
  14.     }
  15.  
  16. ls=allocate 4096
  17. fs=allocate 4096
  18. loaded=0
  19.  
  20. m=81h:f=file
  21. while peekb m<>13
  22.     {
  23.     c=peekb m
  24.     if c>' ' then pokeb f,c:f++
  25.     m++
  26.     }
  27. if f=file then print bios "XREF filename(s)":terminate
  28. pokeb f,0
  29.  
  30. function sept(c)
  31.     {
  32.     return searchb 28 from sps for c
  33.     sps:
  34.     datab ' ',13,10,9,39
  35.     datab '()+-*/=;:"[]{}.,<>@#^|?'
  36.     }
  37.  
  38. proc report
  39.     {
  40.     test break
  41.     print bios "  Label: ";
  42.     a=label:while peekb a print bios chr peek a;:a++
  43.     a=label:while peekb a print chr peek a;:a++
  44.     print
  45.  
  46.     fn=names
  47.     flag=0
  48.     repeat count
  49.     {
  50.     if (count=1) and loaded then goto skipload
  51.     fill 32768 from fs|0 with 1a1ah
  52.     load fn,fs|0
  53.     fs[65535]b=1ah
  54.     loaded=1
  55.  
  56.     skipload:
  57.     fm=0:fst=fm:fa=peekb label
  58.     lines=1
  59.     while fs[fm]b<>1ah
  60.         {
  61.         c=ucase fs[fm]b
  62.         if c=fa then
  63.         {
  64.         sm=fm
  65.         if sept(fs[fm-1]b) then
  66.             {
  67.             la=label
  68.             while (peekb la<>0) and (la<(label+32))
  69.             {
  70.             if peekb la<>ucase fs[fm]b then goto miss
  71.             fm++:la++
  72.             }
  73.             if not sept(fs[fm]b) then goto miss
  74.             if (lm=fm) and (fn=(ln-13)) then goto miss ; Itself?
  75.             print bios cr lf "    ";
  76.             pa=fn:while peekb pa print bios chr peekb pa;:pa++
  77.             print bios "["lines"] ";
  78.             flag++
  79.             pa=fst
  80.  
  81.             col=low curpos
  82.             if (25-col)>0 then repeat 25-col print bios " ";
  83.             col=0
  84.             while fs[pa]b<>13
  85.             {
  86.             p=fs[pa]b
  87.             if p=10 then goto igp
  88.             if p=9 then
  89.                 {
  90.                 x=(col and 248)+8
  91.                 repeat x-col print bios " ";
  92.                 col=x
  93.                 goto igp
  94.                 }
  95.             else print bios chr p;:col++
  96.  
  97.             igp:
  98.             pa++
  99.             }
  100.             goto nextch
  101.  
  102.             miss:
  103.             fm=sm
  104.             }
  105.         }
  106.         if c=13 then
  107.         {
  108.         if fs[fm+1]b=10 then fm++ ; Skip lines feed
  109.         fst=fm+1
  110.         lines++
  111.         }
  112.         fm++
  113.         nextch:
  114.         }
  115.     fn+=13
  116.     }
  117.     if flag then print bios
  118.         else print bios " (not found)"
  119.     }
  120.  
  121. m=names:count=0
  122. find first file
  123. goto entry
  124.  
  125. while count<mf
  126.     {
  127. #errors off
  128.     find next
  129. #errors on
  130.     entry:
  131.     if error then goto check
  132.     moveb 13 from dta segment|dta offset+30 to m
  133.     m+=13:count++
  134.     }
  135.  
  136. check:
  137. ln=names
  138. repeat count-2
  139.     {
  140.     fill 32768 from ls|0 with 1a1ah
  141.     print bios cr lf "References for file: ";
  142.     a=ln
  143.     while peekb a print bios chr peek a;:a++
  144.     print bios
  145.     load ln,ls|0
  146.     ls[65535]b=1ah
  147.     ln+=13:lm=0
  148.     while ls[lm]b<>1ah
  149.     {
  150.     c=ls[lm]b
  151.     if lcase c<>ucase c then
  152.         {
  153.         a=label
  154.         while not sept(ls[lm]b) pokeb a,ucase ls[lm]b:lm++:a++
  155.         pokeb a,0
  156.         report
  157.         goto loope ; Find next lines ... then next label...
  158.         }
  159.     else
  160.         {
  161.         loope:
  162.         c=ls[lm]b
  163.         if c=1ah then goto nls
  164.         if c<>13 then lm++:goto loope
  165.         lm++
  166.         if ls[lm]b=10 then lm++
  167.         }
  168.     nls:
  169.     }
  170.     }
  171.  
  172. print bios cr lf"Done."
  173. terminate
  174.  
  175. file:
  176. space 64
  177.  
  178. names:
  179. space 13*mf
  180.  
  181. label:
  182. space 32
  183.